<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/notifier.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/notifier.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="k">/*</span>
<a name="2" /><span class="True">       2:</span> <span class="k"> *    Routines to manage notifier chains for passing status changes to any</span>
<a name="3" /><span class="True">       3:</span> <span class="k"> *    interested routines. We need this instead of hard coded call lists so</span>
<a name="4" /><span class="True">       4:</span> <span class="k"> *    that modules can poke their nose into the innards. The network devices</span>
<a name="5" /><span class="True">       5:</span> <span class="k"> *    needed them so here they are for the rest of you.</span>
<a name="6" /><span class="True">       6:</span> <span class="k"> *</span>
<a name="7" /><span class="True">       7:</span> <span class="k"> *                Alan Cox &lt;Alan.Cox@linux.org&gt;</span>
<a name="8" /><span class="True">       8:</span> <span class="k"> */</span>
<a name="9" /><span class="True">       9:</span>  
<a name="10" /><span class="Maybe">      10:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX05PVElGSUVSX0hfMA__"><span class="b">_LINUX_NOTIFIER_H</span></a>
<a name="11" /><span class="Maybe">      11:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX05PVElGSUVSX0hfMA__"><span class="b">_LINUX_NOTIFIER_H</span></a>
<a name="12" /><span class="Maybe">      12:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">errno</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="13" /><span class="Maybe">      13:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">mutex</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="14" /><span class="Maybe">      14:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">rwsem</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="15" /><span class="Maybe">      15:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">srcu</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="16" /><span class="Maybe">      16:</span> 
<a name="17" /><span class="Maybe">      17:</span> <span class="k">/*</span>
<a name="18" /><span class="Maybe">      18:</span> <span class="k"> * Notifier chains are of four types:</span>
<a name="19" /><span class="Maybe">      19:</span> <span class="k"> *</span>
<a name="20" /><span class="Maybe">      20:</span> <span class="k"> *    Atomic notifier chains: Chain callbacks run in interrupt/atomic</span>
<a name="21" /><span class="Maybe">      21:</span> <span class="k"> *        context. Callouts are not allowed to block.</span>
<a name="22" /><span class="Maybe">      22:</span> <span class="k"> *    Blocking notifier chains: Chain callbacks run in process context.</span>
<a name="23" /><span class="Maybe">      23:</span> <span class="k"> *        Callouts are allowed to block.</span>
<a name="24" /><span class="Maybe">      24:</span> <span class="k"> *    Raw notifier chains: There are no restrictions on callbacks,</span>
<a name="25" /><span class="Maybe">      25:</span> <span class="k"> *        registration, or unregistration.  All locking and protection</span>
<a name="26" /><span class="Maybe">      26:</span> <span class="k"> *        must be provided by the caller.</span>
<a name="27" /><span class="Maybe">      27:</span> <span class="k"> *    SRCU notifier chains: A variant of blocking notifier chains, with</span>
<a name="28" /><span class="Maybe">      28:</span> <span class="k"> *        the same restrictions.</span>
<a name="29" /><span class="Maybe">      29:</span> <span class="k"> *</span>
<a name="30" /><span class="Maybe">      30:</span> <span class="k"> * atomic_notifier_chain_register() may be called from an atomic context,</span>
<a name="31" /><span class="Maybe">      31:</span> <span class="k"> * but blocking_notifier_chain_register() and srcu_notifier_chain_register()</span>
<a name="32" /><span class="Maybe">      32:</span> <span class="k"> * must be called from a process context.  Ditto for the corresponding</span>
<a name="33" /><span class="Maybe">      33:</span> <span class="k"> * _unregister() routines.</span>
<a name="34" /><span class="Maybe">      34:</span> <span class="k"> *</span>
<a name="35" /><span class="Maybe">      35:</span> <span class="k"> * atomic_notifier_chain_unregister(), blocking_notifier_chain_unregister(),</span>
<a name="36" /><span class="Maybe">      36:</span> <span class="k"> * and srcu_notifier_chain_unregister() _must not_ be called from within</span>
<a name="37" /><span class="Maybe">      37:</span> <span class="k"> * the call chain.</span>
<a name="38" /><span class="Maybe">      38:</span> <span class="k"> *</span>
<a name="39" /><span class="Maybe">      39:</span> <span class="k"> * SRCU notifier chains are an alternative form of blocking notifier chains.</span>
<a name="40" /><span class="Maybe">      40:</span> <span class="k"> * They use SRCU (Sleepable Read-Copy Update) instead of rw-semaphores for</span>
<a name="41" /><span class="Maybe">      41:</span> <span class="k"> * protection of the chain links.  This means there is _very_ low overhead</span>
<a name="42" /><span class="Maybe">      42:</span> <span class="k"> * in srcu_notifier_call_chain(): no cache bounces and no memory barriers.</span>
<a name="43" /><span class="Maybe">      43:</span> <span class="k"> * As compensation, srcu_notifier_chain_unregister() is rather expensive.</span>
<a name="44" /><span class="Maybe">      44:</span> <span class="k"> * SRCU notifier chains should be used when the chain will be called very</span>
<a name="45" /><span class="Maybe">      45:</span> <span class="k"> * often but notifier_blocks will seldom be removed.  Also, SRCU notifier</span>
<a name="46" /><span class="Maybe">      46:</span> <span class="k"> * chains are slightly more difficult to use because they require special</span>
<a name="47" /><span class="Maybe">      47:</span> <span class="k"> * runtime initialization.</span>
<a name="48" /><span class="Maybe">      48:</span> <span class="k"> */</span>
<a name="49" /><span class="Maybe">      49:</span> 
<a name="50" /><span class="Maybe">      50:</span> <span class="m">typedef</span>    <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">notifier_fn_t</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">notifier_block</span> <span class="f">*</span><span class="b">nb</span><span class="f">,</span>
<a name="51" /><span class="Maybe">      51:</span>             <span class="m">unsigned</span> <span class="m">long</span> <span class="b">action</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">data</span><span class="f">)</span><span class="f">;</span>
<a name="52" /><span class="Maybe">      52:</span> 
<a name="53" /><span class="Maybe">      53:</span> <span class="m">struct</span> <span class="b">notifier_block</span> <span class="f">{</span>
<a name="54" /><span class="Maybe">      54:</span>     <span class="b">notifier_fn_t</span> <span class="b">notifier_call</span><span class="f">;</span>
<a name="55" /><span class="Maybe">      55:</span>     <span class="m">struct</span> <span class="b">notifier_block</span> <a href="cpu.c_macros_ref.html#_X19yY3VfMA__"><span class="b">__rcu</span></a> <span class="f">*</span><span class="b">next</span><span class="f">;</span>
<a name="56" /><span class="Maybe">      56:</span>     <span class="m">int</span> <span class="b">priority</span><span class="f">;</span>
<a name="57" /><span class="Maybe">      57:</span> <span class="f">}</span><span class="f">;</span>
<a name="58" /><span class="Maybe">      58:</span> 
<a name="59" /><span class="Maybe">      59:</span> <span class="m">struct</span> <span class="b">atomic_notifier_head</span> <span class="f">{</span>
<a name="60" /><span class="Maybe">      60:</span>     <span class="b">spinlock_t</span> <span class="b">lock</span><span class="f">;</span>
<a name="61" /><span class="Maybe">      61:</span>     <span class="m">struct</span> <span class="b">notifier_block</span> <a href="cpu.c_macros_ref.html#_X19yY3VfMA__"><span class="b">__rcu</span></a> <span class="f">*</span><span class="b">head</span><span class="f">;</span>
<a name="62" /><span class="Maybe">      62:</span> <span class="f">}</span><span class="f">;</span>
<a name="63" /><span class="Maybe">      63:</span> 
<a name="64" /><span class="Maybe">      64:</span> <span class="m">struct</span> <span class="b">blocking_notifier_head</span> <span class="f">{</span>
<a name="65" /><span class="Maybe">      65:</span>     <span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="b">rwsem</span><span class="f">;</span>
<a name="66" /><span class="Maybe">      66:</span>     <span class="m">struct</span> <span class="b">notifier_block</span> <a href="cpu.c_macros_ref.html#_X19yY3VfMA__"><span class="b">__rcu</span></a> <span class="f">*</span><span class="b">head</span><span class="f">;</span>
<a name="67" /><span class="Maybe">      67:</span> <span class="f">}</span><span class="f">;</span>
<a name="68" /><span class="Maybe">      68:</span> 
<a name="69" /><span class="Maybe">      69:</span> <span class="m">struct</span> <span class="b">raw_notifier_head</span> <span class="f">{</span>
<a name="70" /><span class="Maybe">      70:</span>     <span class="m">struct</span> <span class="b">notifier_block</span> <a href="cpu.c_macros_ref.html#_X19yY3VfMA__"><span class="b">__rcu</span></a> <span class="f">*</span><span class="b">head</span><span class="f">;</span>
<a name="71" /><span class="Maybe">      71:</span> <span class="f">}</span><span class="f">;</span>
<a name="72" /><span class="Maybe">      72:</span> 
<a name="73" /><span class="Maybe">      73:</span> <span class="m">struct</span> <span class="b">srcu_notifier_head</span> <span class="f">{</span>
<a name="74" /><span class="Maybe">      74:</span>     <span class="m">struct</span> <span class="b">mutex</span> <span class="b">mutex</span><span class="f">;</span>
<a name="75" /><span class="Maybe">      75:</span>     <span class="m">struct</span> <span class="b">srcu_struct</span> <span class="b">srcu</span><span class="f">;</span>
<a name="76" /><span class="Maybe">      76:</span>     <span class="m">struct</span> <span class="b">notifier_block</span> <a href="cpu.c_macros_ref.html#_X19yY3VfMA__"><span class="b">__rcu</span></a> <span class="f">*</span><span class="b">head</span><span class="f">;</span>
<a name="77" /><span class="Maybe">      77:</span> <span class="f">}</span><span class="f">;</span>
<a name="78" /><span class="Maybe">      78:</span> 
<a name="79" /><span class="Maybe">      79:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QVRPTUlDX0lOSVRfTk9USUZJRVJfSEVBRF8w"><span class="b">ATOMIC_INIT_NOTIFIER_HEAD</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span> <span class="m">do</span> <span class="f">{</span>    \
<a name="80" /><span class="Maybe">      80:</span>         <a href="cpu.c_macros_ref.html#_c3Bpbl9sb2NrX2luaXRfMA__"><span class="b">spin_lock_init</span></a><span class="f">(</span><span class="f">&amp;</span><span class="f">(</span><span class="b">name</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">lock</span><span class="f">)</span><span class="f">;</span>    \
<a name="81" /><span class="Maybe">      81:</span>         <span class="f">(</span><span class="b">name</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">head</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">;</span>        \
<a name="82" /><span class="Maybe">      82:</span>     <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="83" /><span class="Maybe">      83:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QkxPQ0tJTkdfSU5JVF9OT1RJRklFUl9IRUFEXzA_"><span class="b">BLOCKING_INIT_NOTIFIER_HEAD</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span> <span class="m">do</span> <span class="f">{</span>    \
<a name="84" /><span class="Maybe">      84:</span>         <a href="cpu.c_macros_noref.html#_aW5pdF9yd3NlbV8w"><span class="b">init_rwsem</span></a><span class="f">(</span><span class="f">&amp;</span><span class="f">(</span><span class="b">name</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">rwsem</span><span class="f">)</span><span class="f">;</span>    \
<a name="85" /><span class="Maybe">      85:</span>         <span class="f">(</span><span class="b">name</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">head</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">;</span>        \
<a name="86" /><span class="Maybe">      86:</span>     <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="87" /><span class="Maybe">      87:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_UkFXX0lOSVRfTk9USUZJRVJfSEVBRF8w"><span class="b">RAW_INIT_NOTIFIER_HEAD</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span> <span class="m">do</span> <span class="f">{</span>    \
<a name="88" /><span class="Maybe">      88:</span>         <span class="f">(</span><span class="b">name</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">head</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">;</span>        \
<a name="89" /><span class="Maybe">      89:</span>     <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="90" /><span class="Maybe">      90:</span> 
<a name="91" /><span class="Maybe">      91:</span> <span class="k">/* srcu_notifier_heads must be initialized and cleaned up dynamically */</span>
<a name="92" /><span class="Maybe">      92:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">srcu_init_notifier_head</span><span class="f">(</span><span class="m">struct</span> <span class="b">srcu_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">)</span><span class="f">;</span>
<a name="93" /><span class="Maybe">      93:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_c3JjdV9jbGVhbnVwX25vdGlmaWVyX2hlYWRfMA__"><span class="b">srcu_cleanup_notifier_head</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span>    \
<a name="94" /><span class="Maybe">      94:</span>         <span class="b">cleanup_srcu_struct</span><span class="f">(</span><span class="f">&amp;</span><span class="f">(</span><span class="b">name</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">srcu</span><span class="f">)</span><span class="f">;</span>
<a name="95" /><span class="Maybe">      95:</span> 
<a name="96" /><span class="Maybe">      96:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QVRPTUlDX05PVElGSUVSX0lOSVRfMA__"><span class="b">ATOMIC_NOTIFIER_INIT</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span> <span class="f">{</span>                \
<a name="97" /><span class="Maybe">      97:</span>         <span class="f">.</span><span class="b">lock</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_X19TUElOX0xPQ0tfVU5MT0NLRURfMA__"><span class="b">__SPIN_LOCK_UNLOCKED</span></a><span class="f">(</span><span class="b">name</span><span class="f">.</span><span class="b">lock</span><span class="f">)</span><span class="f">,</span>    \
<a name="98" /><span class="Maybe">      98:</span>         <span class="f">.</span><span class="b">head</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a> <span class="f">}</span>
<a name="99" /><span class="Maybe">      99:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QkxPQ0tJTkdfTk9USUZJRVJfSU5JVF8w"><span class="b">BLOCKING_NOTIFIER_INIT</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span> <span class="f">{</span>                \
<a name="100" /><span class="Maybe">     100:</span>         <span class="f">.</span><span class="b">rwsem</span> <span class="f">=</span> <a href="cpu.c_macros_noref.html#_X19SV1NFTV9JTklUSUFMSVpFUl8w"><span class="b">__RWSEM_INITIALIZER</span></a><span class="f">(</span><span class="f">(</span><span class="b">name</span><span class="f">)</span><span class="f">.</span><span class="b">rwsem</span><span class="f">)</span><span class="f">,</span>    \
<a name="101" /><span class="Maybe">     101:</span>         <span class="f">.</span><span class="b">head</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a> <span class="f">}</span>
<a name="102" /><span class="Maybe">     102:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_UkFXX05PVElGSUVSX0lOSVRfMA__"><span class="b">RAW_NOTIFIER_INIT</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span>    <span class="f">{</span>                \
<a name="103" /><span class="Maybe">     103:</span>         <span class="f">.</span><span class="b">head</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a> <span class="f">}</span>
<a name="104" /><span class="Maybe">     104:</span> <span class="k">/* srcu_notifier_heads cannot be initialized statically */</span>
<a name="105" /><span class="Maybe">     105:</span> 
<a name="106" /><span class="Maybe">     106:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QVRPTUlDX05PVElGSUVSX0hFQURfMA__"><span class="b">ATOMIC_NOTIFIER_HEAD</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span>                \
<a name="107" /><span class="Maybe">     107:</span>     <span class="m">struct</span> <span class="b">atomic_notifier_head</span> <span class="b">name</span> <span class="f">=</span>            \
<a name="108" /><span class="Maybe">     108:</span>         <a href="cpu.c_macros_noref.html#_QVRPTUlDX05PVElGSUVSX0lOSVRfMA__"><span class="b">ATOMIC_NOTIFIER_INIT</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span>
<a name="109" /><span class="Maybe">     109:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QkxPQ0tJTkdfTk9USUZJRVJfSEVBRF8w"><span class="b">BLOCKING_NOTIFIER_HEAD</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span>                \
<a name="110" /><span class="Maybe">     110:</span>     <span class="m">struct</span> <span class="b">blocking_notifier_head</span> <span class="b">name</span> <span class="f">=</span>            \
<a name="111" /><span class="Maybe">     111:</span>         <a href="cpu.c_macros_noref.html#_QkxPQ0tJTkdfTk9USUZJRVJfSU5JVF8w"><span class="b">BLOCKING_NOTIFIER_INIT</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span>
<a name="112" /><span class="Maybe">     112:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_UkFXX05PVElGSUVSX0hFQURfMA__"><span class="b">RAW_NOTIFIER_HEAD</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span>                    \
<a name="113" /><span class="Maybe">     113:</span>     <span class="m">struct</span> <span class="b">raw_notifier_head</span> <span class="b">name</span> <span class="f">=</span>                \
<a name="114" /><span class="Maybe">     114:</span>         <a href="cpu.c_macros_ref.html#_UkFXX05PVElGSUVSX0lOSVRfMA__"><span class="b">RAW_NOTIFIER_INIT</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span>
<a name="115" /><span class="Maybe">     115:</span> 
<a name="116" /><span class="Maybe">     116:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_X19LRVJORUxfX18w"><span class="b">__KERNEL__</span></a>
<a name="117" /><span class="Maybe">     117:</span> 
<a name="118" /><span class="Maybe">     118:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">atomic_notifier_chain_register</span><span class="f">(</span><span class="m">struct</span> <span class="b">atomic_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="119" /><span class="Maybe">     119:</span>         <span class="m">struct</span> <span class="b">notifier_block</span> <span class="f">*</span><span class="b">nb</span><span class="f">)</span><span class="f">;</span>
<a name="120" /><span class="Maybe">     120:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">blocking_notifier_chain_register</span><span class="f">(</span><span class="m">struct</span> <span class="b">blocking_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="121" /><span class="Maybe">     121:</span>         <span class="m">struct</span> <span class="b">notifier_block</span> <span class="f">*</span><span class="b">nb</span><span class="f">)</span><span class="f">;</span>
<a name="122" /><span class="Maybe">     122:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">raw_notifier_chain_register</span><span class="f">(</span><span class="m">struct</span> <span class="b">raw_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="123" /><span class="Maybe">     123:</span>         <span class="m">struct</span> <span class="b">notifier_block</span> <span class="f">*</span><span class="b">nb</span><span class="f">)</span><span class="f">;</span>
<a name="124" /><span class="Maybe">     124:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">srcu_notifier_chain_register</span><span class="f">(</span><span class="m">struct</span> <span class="b">srcu_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="125" /><span class="Maybe">     125:</span>         <span class="m">struct</span> <span class="b">notifier_block</span> <span class="f">*</span><span class="b">nb</span><span class="f">)</span><span class="f">;</span>
<a name="126" /><span class="Maybe">     126:</span> 
<a name="127" /><span class="Maybe">     127:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">blocking_notifier_chain_cond_register</span><span class="f">(</span>
<a name="128" /><span class="Maybe">     128:</span>         <span class="m">struct</span> <span class="b">blocking_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="129" /><span class="Maybe">     129:</span>         <span class="m">struct</span> <span class="b">notifier_block</span> <span class="f">*</span><span class="b">nb</span><span class="f">)</span><span class="f">;</span>
<a name="130" /><span class="Maybe">     130:</span> 
<a name="131" /><span class="Maybe">     131:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">atomic_notifier_chain_unregister</span><span class="f">(</span><span class="m">struct</span> <span class="b">atomic_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="132" /><span class="Maybe">     132:</span>         <span class="m">struct</span> <span class="b">notifier_block</span> <span class="f">*</span><span class="b">nb</span><span class="f">)</span><span class="f">;</span>
<a name="133" /><span class="Maybe">     133:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">blocking_notifier_chain_unregister</span><span class="f">(</span><span class="m">struct</span> <span class="b">blocking_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="134" /><span class="Maybe">     134:</span>         <span class="m">struct</span> <span class="b">notifier_block</span> <span class="f">*</span><span class="b">nb</span><span class="f">)</span><span class="f">;</span>
<a name="135" /><span class="Maybe">     135:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">raw_notifier_chain_unregister</span><span class="f">(</span><span class="m">struct</span> <span class="b">raw_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="136" /><span class="Maybe">     136:</span>         <span class="m">struct</span> <span class="b">notifier_block</span> <span class="f">*</span><span class="b">nb</span><span class="f">)</span><span class="f">;</span>
<a name="137" /><span class="Maybe">     137:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">srcu_notifier_chain_unregister</span><span class="f">(</span><span class="m">struct</span> <span class="b">srcu_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="138" /><span class="Maybe">     138:</span>         <span class="m">struct</span> <span class="b">notifier_block</span> <span class="f">*</span><span class="b">nb</span><span class="f">)</span><span class="f">;</span>
<a name="139" /><span class="Maybe">     139:</span> 
<a name="140" /><span class="Maybe">     140:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">atomic_notifier_call_chain</span><span class="f">(</span><span class="m">struct</span> <span class="b">atomic_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="141" /><span class="Maybe">     141:</span>         <span class="m">unsigned</span> <span class="m">long</span> <span class="b">val</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span><span class="f">;</span>
<a name="142" /><span class="Maybe">     142:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">__atomic_notifier_call_chain</span><span class="f">(</span><span class="m">struct</span> <span class="b">atomic_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="143" /><span class="Maybe">     143:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">val</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">v</span><span class="f">,</span> <span class="m">int</span> <span class="b">nr_to_call</span><span class="f">,</span> <span class="m">int</span> <span class="f">*</span><span class="b">nr_calls</span><span class="f">)</span><span class="f">;</span>
<a name="144" /><span class="Maybe">     144:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">blocking_notifier_call_chain</span><span class="f">(</span><span class="m">struct</span> <span class="b">blocking_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="145" /><span class="Maybe">     145:</span>         <span class="m">unsigned</span> <span class="m">long</span> <span class="b">val</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span><span class="f">;</span>
<a name="146" /><span class="Maybe">     146:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">__blocking_notifier_call_chain</span><span class="f">(</span><span class="m">struct</span> <span class="b">blocking_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="147" /><span class="Maybe">     147:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">val</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">v</span><span class="f">,</span> <span class="m">int</span> <span class="b">nr_to_call</span><span class="f">,</span> <span class="m">int</span> <span class="f">*</span><span class="b">nr_calls</span><span class="f">)</span><span class="f">;</span>
<a name="148" /><span class="Maybe">     148:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">raw_notifier_call_chain</span><span class="f">(</span><span class="m">struct</span> <span class="b">raw_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="149" /><span class="Maybe">     149:</span>         <span class="m">unsigned</span> <span class="m">long</span> <span class="b">val</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span><span class="f">;</span>
<a name="150" /><span class="Maybe">     150:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">__raw_notifier_call_chain</span><span class="f">(</span><span class="m">struct</span> <span class="b">raw_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="151" /><span class="Maybe">     151:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">val</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">v</span><span class="f">,</span> <span class="m">int</span> <span class="b">nr_to_call</span><span class="f">,</span> <span class="m">int</span> <span class="f">*</span><span class="b">nr_calls</span><span class="f">)</span><span class="f">;</span>
<a name="152" /><span class="Maybe">     152:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">srcu_notifier_call_chain</span><span class="f">(</span><span class="m">struct</span> <span class="b">srcu_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="153" /><span class="Maybe">     153:</span>         <span class="m">unsigned</span> <span class="m">long</span> <span class="b">val</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span><span class="f">;</span>
<a name="154" /><span class="Maybe">     154:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">__srcu_notifier_call_chain</span><span class="f">(</span><span class="m">struct</span> <span class="b">srcu_notifier_head</span> <span class="f">*</span><span class="b">nh</span><span class="f">,</span>
<a name="155" /><span class="Maybe">     155:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">val</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">v</span><span class="f">,</span> <span class="m">int</span> <span class="b">nr_to_call</span><span class="f">,</span> <span class="m">int</span> <span class="f">*</span><span class="b">nr_calls</span><span class="f">)</span><span class="f">;</span>
<a name="156" /><span class="Maybe">     156:</span> 
<a name="157" /><span class="Maybe">     157:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_Tk9USUZZX0RPTkVfMA__"><span class="b">NOTIFY_DONE</span></a>        <span class="c">0x0000</span>        <span class="k">/* Don&apos;t care */</span>
<a name="158" /><span class="Maybe">     158:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_Tk9USUZZX09LXzA_"><span class="b">NOTIFY_OK</span></a>        <span class="c">0x0001</span>        <span class="k">/* Suits me */</span>
<a name="159" /><span class="Maybe">     159:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_Tk9USUZZX1NUT1BfTUFTS18w"><span class="b">NOTIFY_STOP_MASK</span></a>    <span class="c">0x8000</span>        <span class="k">/* Don&apos;t call further */</span>
<a name="160" /><span class="Maybe">     160:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Tk9USUZZX0JBRF8w"><span class="b">NOTIFY_BAD</span></a>        <span class="f">(</span><a href="cpu.c_macros_ref.html#_Tk9USUZZX1NUT1BfTUFTS18w"><span class="b">NOTIFY_STOP_MASK</span></a><span class="f">|</span><span class="c">0x0002</span><span class="f">)</span>
<a name="161" /><span class="Maybe">     161:</span>                         <span class="k">/* Bad/Veto action */</span>
<a name="162" /><span class="Maybe">     162:</span> <span class="k">/*</span>
<a name="163" /><span class="Maybe">     163:</span> <span class="k"> * Clean way to return from the notifier and stop further calls.</span>
<a name="164" /><span class="Maybe">     164:</span> <span class="k"> */</span>
<a name="165" /><span class="Maybe">     165:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Tk9USUZZX1NUT1BfMA__"><span class="b">NOTIFY_STOP</span></a>        <span class="f">(</span><a href="cpu.c_macros_ref.html#_Tk9USUZZX09LXzA_"><span class="b">NOTIFY_OK</span></a><span class="f">|</span><a href="cpu.c_macros_ref.html#_Tk9USUZZX1NUT1BfTUFTS18w"><span class="b">NOTIFY_STOP_MASK</span></a><span class="f">)</span>
<a name="166" /><span class="Maybe">     166:</span> 
<a name="167" /><span class="Maybe">     167:</span> <span class="k">/* Encapsulate (negative) errno value (in particular, NOTIFY_BAD &lt;=&gt; EPERM). */</span>
<a name="168" /><span class="Maybe">     168:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">notifier_from_errno</span><span class="f">(</span><span class="m">int</span> <span class="b">err</span><span class="f">)</span>
<a name="169" /><span class="Maybe">     169:</span> <span class="f">{</span>
<a name="170" /><span class="Maybe">     170:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">err</span><span class="f">)</span>
<a name="171" /><span class="Maybe">     171:</span>         <span class="m">return</span> <a href="cpu.c_macros_ref.html#_Tk9USUZZX1NUT1BfTUFTS18w"><span class="b">NOTIFY_STOP_MASK</span></a> <span class="f">|</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_Tk9USUZZX09LXzA_"><span class="b">NOTIFY_OK</span></a> <span class="f">-</span> <span class="b">err</span><span class="f">)</span><span class="f">;</span>
<a name="172" /><span class="Maybe">     172:</span> 
<a name="173" /><span class="Maybe">     173:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_Tk9USUZZX09LXzA_"><span class="b">NOTIFY_OK</span></a><span class="f">;</span>
<a name="174" /><span class="Maybe">     174:</span> <span class="f">}</span>
<a name="175" /><span class="Maybe">     175:</span> 
<a name="176" /><span class="Maybe">     176:</span> <span class="k">/* Restore (negative) errno value from notify return value. */</span>
<a name="177" /><span class="Maybe">     177:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">notifier_to_errno</span><span class="f">(</span><span class="m">int</span> <span class="b">ret</span><span class="f">)</span>
<a name="178" /><span class="Maybe">     178:</span> <span class="f">{</span>
<a name="179" /><span class="Maybe">     179:</span>     <span class="b">ret</span> <span class="f">&amp;=</span> <span class="f">~</span><a href="cpu.c_macros_ref.html#_Tk9USUZZX1NUT1BfTUFTS18w"><span class="b">NOTIFY_STOP_MASK</span></a><span class="f">;</span>
<a name="180" /><span class="Maybe">     180:</span>     <span class="m">return</span> <span class="b">ret</span> <span class="f">&gt;</span> <a href="cpu.c_macros_ref.html#_Tk9USUZZX09LXzA_"><span class="b">NOTIFY_OK</span></a> <span class="f">?</span> <a href="cpu.c_macros_ref.html#_Tk9USUZZX09LXzA_"><span class="b">NOTIFY_OK</span></a> <span class="f">-</span> <span class="b">ret</span> <span class="f">:</span> <span class="c">0</span><span class="f">;</span>
<a name="181" /><span class="Maybe">     181:</span> <span class="f">}</span>
<a name="182" /><span class="Maybe">     182:</span> 
<a name="183" /><span class="Maybe">     183:</span> <span class="k">/*</span>
<a name="184" /><span class="Maybe">     184:</span> <span class="k"> *    Declared notifiers so far. I can imagine quite a few more chains</span>
<a name="185" /><span class="Maybe">     185:</span> <span class="k"> *    over time (eg laptop power reset chains, reboot chain (to clean </span>
<a name="186" /><span class="Maybe">     186:</span> <span class="k"> *    device units up), device [un]mount chain, module load/unload chain,</span>
<a name="187" /><span class="Maybe">     187:</span> <span class="k"> *    low memory chain, screenblank chain (for plug in modular screenblankers) </span>
<a name="188" /><span class="Maybe">     188:</span> <span class="k"> *    VC switch chains (for loadable kernel svgalib VC switch helpers) etc...</span>
<a name="189" /><span class="Maybe">     189:</span> <span class="k"> */</span>
<a name="190" /><span class="Maybe">     190:</span>  
<a name="191" /><span class="Maybe">     191:</span> <span class="k">/* CPU notfiers are defined in include/linux/cpu.h. */</span>
<a name="192" /><span class="Maybe">     192:</span> 
<a name="193" /><span class="Maybe">     193:</span> <span class="k">/* netdevice notifiers are defined in include/linux/netdevice.h */</span>
<a name="194" /><span class="Maybe">     194:</span> 
<a name="195" /><span class="Maybe">     195:</span> <span class="k">/* reboot notifiers are defined in include/linux/reboot.h. */</span>
<a name="196" /><span class="Maybe">     196:</span> 
<a name="197" /><span class="Maybe">     197:</span> <span class="k">/* Hibernation and suspend events are defined in include/linux/suspend.h. */</span>
<a name="198" /><span class="Maybe">     198:</span> 
<a name="199" /><span class="Maybe">     199:</span> <span class="k">/* Virtual Terminal events are defined in include/linux/vt.h. */</span>
<a name="200" /><span class="Maybe">     200:</span> 
<a name="201" /><span class="Maybe">     201:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_TkVUTElOS19VUkVMRUFTRV8w"><span class="b">NETLINK_URELEASE</span></a>    <span class="c">0x0001</span>    <span class="k">/* Unicast netlink socket released */</span>
<a name="202" /><span class="Maybe">     202:</span> 
<a name="203" /><span class="Maybe">     203:</span> <span class="k">/* Console keyboard events.</span>
<a name="204" /><span class="Maybe">     204:</span> <span class="k"> * Note: KBD_KEYCODE is always sent before KBD_UNBOUND_KEYCODE, KBD_UNICODE and</span>
<a name="205" /><span class="Maybe">     205:</span> <span class="k"> * KBD_KEYSYM. */</span>
<a name="206" /><span class="Maybe">     206:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_S0JEX0tFWUNPREVfMA__"><span class="b">KBD_KEYCODE</span></a>        <span class="c">0x0001</span> <span class="k">/* Keyboard keycode, called before any other */</span>
<a name="207" /><span class="Maybe">     207:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_S0JEX1VOQk9VTkRfS0VZQ09ERV8w"><span class="b">KBD_UNBOUND_KEYCODE</span></a>    <span class="c">0x0002</span> <span class="k">/* Keyboard keycode which is not bound to any other */</span>
<a name="208" /><span class="Maybe">     208:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_S0JEX1VOSUNPREVfMA__"><span class="b">KBD_UNICODE</span></a>        <span class="c">0x0003</span> <span class="k">/* Keyboard unicode */</span>
<a name="209" /><span class="Maybe">     209:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_S0JEX0tFWVNZTV8w"><span class="b">KBD_KEYSYM</span></a>        <span class="c">0x0004</span> <span class="k">/* Keyboard keysym */</span>
<a name="210" /><span class="Maybe">     210:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_S0JEX1BPU1RfS0VZU1lNXzA_"><span class="b">KBD_POST_KEYSYM</span></a>        <span class="c">0x0005</span> <span class="k">/* Called after keyboard keysym interpretation */</span>
<a name="211" /><span class="Maybe">     211:</span> 
<a name="212" /><span class="Maybe">     212:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">blocking_notifier_head</span> <span class="b">reboot_notifier_list</span><span class="f">;</span>
<a name="213" /><span class="Maybe">     213:</span> 
<a name="214" /><span class="Maybe">     214:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* __KERNEL__ */</span>
<a name="215" /><span class="True">     215:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _LINUX_NOTIFIER_H */</span>
<a name="216" /><span class="True">     216:</span> </pre>
  </body>
</html>
